#ifndef __CONFIG_H__
#define __CONFIG_H__

#include <cassert>
#include <memory>
#include <iostream>
#include "zlog_app.h"

using namespace std;

#define DATA_MAX_LEN 1024 // 数据域最大长度

struct dev_config
{
    uint16_t bind_port; // 绑定端口
    // uint16_t dev_type;           // 设备类型
    // string dev_ip;               // 设备IP地址
    // uint16_t rsp_num;            // RSP数量
    uint16_t modbus_udp_port;    // Modbus UDP端口
    string modbus_ip;            // Modbus IP地址
    uint32_t auto_push_data;     // 自动上传数据
    uint32_t auto_get_threshold; // 自动获取阈值
    string ethernet_card_name;   // 以太网网卡名称
    uint32_t dev_type_code;      // 设备类型码
    string modbus_tty;           // Modbus rtu tty名称
};
struct dev_flags
{
    uint16_t get_threshold_config_ok = 0; // 获取设备配置
    time_t test_dev_timestamp;            // 测试设备时间戳
    time_t server_timestamp;              // 服务器时间戳
};

class app_config
{
public:
    struct dev_config cfg;

private:
    std::shared_ptr<zlog_app> _log;
    int lock_fd = -1;

public:
    app_config(std::shared_ptr<zlog_app> zlog_app);
    // 使用 = delete 明确删除复制操作
    app_config() = delete;
    app_config(const app_config &) = delete;
    app_config &operator=(const app_config &) = delete;
    // 获取锁
    bool acquire_lock(void);
    // 释放锁（会自动删除文件或解锁）
    void release_lock(void);
    const struct dev_config *get_dev_config(void)
    {
        return &cfg;
    }
    void default_config(void);
    // 打印配置（用于测试）
    void print_config(void);
    // 从 JSON 文件加载配置到 dev_config
    bool load_config_from_file(void);
    // 将 dev_config 保存为 JSON 文件
    bool save_config_to_file(void);

    /**
     * @brief 将格式为 "YYYY-MM-DD HH:MM:SS" 的字符串转换为时间戳
     *
     * @param str_time  输入的时间字符串
     * @param timestamp 输出的时间戳（通过指针返回）
     * @return int      转换成功返回 1，失败返回 0
     */
    int datetime_to_timestamp(const char *str_time, time_t *timestamp);
    /**
     * @brief 设置 Linux 系统时间
     *
     * @param timestamp 要设置的时间戳（UTC 时间）
     * @return int      成功返回 0，失败返回 1
     */
    int set_linux_sys_time(time_t timestamp);
};
/*****************************************************/

#endif
